어셈블리_09_Ghidra를 활용한 디컴파일(Decompilation) 분석
IDA Pro는 현업에서 가장 널리 쓰이는 강력한 도구지만 높은 라이선스 비용 때문에 개인 학습용으로 접근하기는 어렵다.
따라서 NSA(미국 국가안보국)가 공개한 오픈소스 프레임워크인 Ghidra(기드라)를 쓰면 된다. 무료임에도 불구하고 강력한 디컴파일 기능을 제공한다.
1. 정적 분석과 디컴파일러
어셈블리 코드는 기계어와 1:1로 대응되므로 정확한 동작을 파악할 수 있다는 장점이 있지만, 가독성이 현저히 떨어진다. 수만 줄의 어셈블리 코드를 눈으로만 분석하는 것은 비효율적이다.
디컴파일러(Decompiler)는 기계어 코드를 분석하여 C언어와 유사한 Pseudo Code(의사 코드)로 복원해준다.
MOV EAX, [RBP-0x4]->user_input = local_varCMP EAX, 10/JNE->if (user_input == 10) { ... }
이는 원본 소스 코드와 100% 일치하지는 않지만(변수명 소실 등), 전체적인 로직 흐름을 파악하는 데 압도적인 효율을 제공한다.
2. Ghidra 설치
Ghidra는 Java 기반으로 동작하므로 JDK 11 이상(OpenJDK 17 권장)이 필요하다. Ghidra 공식 홈페이지에서 다운로드 후 ghidraRun 스크립트를 실행하면 된다.
3. 분석 실습: Rename & Retype
Ghidra의 핵심 기능은 심볼의 이름을 짓는 것(Naming)이다. 초기 디컴파일 결과는 의미를 알 수 없는 변수명으로 가득하다.
void undefined4 func_123(int iVar1) {
if (iVar1 == 0xdeadbeef) { ... }
}
분석가는 문맥을 파악하여 func_123이 "비밀번호 검증" 역할을 하고, iVar1이 "사용자 입력"임을 유추해야 한다. 확인 후 단축키 L을 눌러 이름을 변경한다.
void check_password(int input_key) {
if (input_key == 0xdeadbeef) { ... }
}
변수와 함수의 이름을 명확히 붙여나가는 과정이 곧 리버스 엔지니어링의 핵심이다. 단, 디컴파일러의 해석이 항상 완벽하지는 않으므로 왼쪽의 Listing View(어셈블리)를 교차 검증하는 습관이 필요하다.